<!DOCTYPE html>
<meta charset=utf-8>
<title>Document.createElement</title>
<link rel=help href="https://dom.spec.whatwg.org/#dom-document-createelement">
<link rel=help href="https://dom.spec.whatwg.org/#dom-element-localname">
<link rel=help href="https://dom.spec.whatwg.org/#dom-element-tagname">
<link rel=help href="https://dom.spec.whatwg.org/#dom-element-prefix">
<link rel=help href="https://dom.spec.whatwg.org/#dom-element-namespaceuri">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<div id="log"></div>
<script>
function toASCIIUppercase(str) {
  var diff = "a".charCodeAt(0) - "A".charCodeAt(0);
  var res = "";
  for (var i = 0; i < str.length; ++i) {
    if ("a" <= str[i] && str[i] <= "z") {
      res += String.fromCharCode(str.charCodeAt(i) - diff);
    } else {
      res += str[i];
    }
  }
  return res;
}
test(function() {
  var HTMLNS = "http://www.w3.org/1999/xhtml",
      valid = [
        //[input, localName],
        [undefined, "undefined"],
        [null, "null"],
        ["foo", "foo"],
        ["f1oo", "f1oo"],
        ["foo1", "foo1"],
        ["f\u0300oo", "f\u0300oo"],
        ["foo\u0300", "foo\u0300"],
        [":foo", ":foo"],
        ["f:oo", "f:oo"],
        ["foo:", "foo:"],
        ["xml", "xml"],
        ["xmlns", "xmlns"],
        ["xmlfoo", "xmlfoo"],
        ["xml:foo", "xml:foo"],
        ["xmlns:foo", "xmlns:foo"],
        ["xmlfoo:bar", "xmlfoo:bar"],
        ["svg", "svg"],
        ["math", "math"],
        ["FOO", "foo"],
        ["mar\u212a", "mar\u212a"],
        ["\u0130nput", "\u0130nput"],
        ["\u0131nput", "\u0131nput"]
     ],
     invalid = [
       "",
       "1foo",
       "\u0300foo",
       "}foo",
       "f}oo",
       "foo}",
       "\ufffffoo",
       "f\uffffoo",
       "foo\uffff",
       "<foo",
       "foo>",
       "<foo>",
       "f<oo"
     ]

  valid.forEach(function(t) {
    test(function() {
      var elt = document.createElement(t[0])
      assert_true(elt instanceof Element)
      assert_true(elt instanceof Node)
      assert_equals(elt.localName, t[1])
      assert_equals(elt.tagName, toASCIIUppercase(t[1]))
      assert_equals(elt.prefix, null)
      assert_equals(elt.namespaceURI, HTMLNS)
    }, "createElement(" + format_value(t[0]) + ")");
  });
  invalid.forEach(function(arg) {
    test(function() {
      assert_throws("INVALID_CHARACTER_ERR", function() { document.createElement(arg) })
    }, "createElement(" + format_value(arg) + ")");
  });
})
</script>
